Ví dụ sử dụng Semaphore (tin học)

Do semaphore có thể có con đếm, semaphore thường được dùng khi nhiều luồng (thread) cùng cần đạt được một mục tiêu. Xét ví dụ nếu ta có một luồng A cần thông tin từ hai cơ sở dữ liệu, trước khi nó có thể tiến hành truy nhập, Quyền truy nhập các cơ sở dữ liệu này đang được điều khiển bởi hai luồng riêng biệt B và C. Hai luồng này có một vòng lặp xử lý thông điệp (message-processing loop); ai cần đến chúng sẽ gửi một thông điệp vào hàng đợi thông điệp của chúng. Luồng A khởi tạo một semaphore S với lệnh init(S,-1). Sau đó A gửi một yêu cầu dữ liệu tới cả B và C, kèm theo một con trỏ tới semaphore S. Tiếp theo, A gọi P(S), lệnh này chặn (block) A lại. Trong lúc đó, hai luồng kia tiếp tục lấy thông tin; khi mỗi luồng lấy thông tin xong, nó gọi V(S) đối với semaphore được truyền. Chỉ sau khi cả hai luồng đã hoàn thành, semaphore mới đạt giá trị dương và A mới có thể chạy tiếp. Một semaphore được sử dụng kiểu này được gọi là một "semaphore đếm" (counting semaphore).

Bên cạnh semaphore đếm, ta còn có "semaphore chặn" (blocking semaphore). Đó là loại semaphore được khởi tạo tại giá trị 0. Điều này có hiệu quả là bất cứ luồng nào gọi P(S) sẽ bị chặn cho đến khi một luồng khác chạy V(S). Loại cấu trúc này rất hữu dụng khi cần điều khiển thứ tự thực thi giữa các luồng.

Loại semaphore đơn giản nhất là "semaphore nhị phân", được dùng để điều khiển truy nhập tới một tài nguyên duy nhất, loại này về bản chất không khác mutex. Semaphore nhị phân thường được khởi tạo tại giá trị 1. Khi tài nguyên đang được sử dụng, luồng truy nhập gọi P(S) để giảm giá trị của nó về 0, và khôi phục giá trị 1 bằng toán tử V khi tài nguyên sẵn sàng được thả ra.

Liên quan

Tài liệu tham khảo

WikiPedia: Semaphore (tin học) http://c2.com/cgi/wiki?SemaphoresForMutualExclusio... http://codeproject.com/csharp/inprocsemaphore.asp http://greenteapress.com/semaphores/ http://java.sun.com/j2se/1.5.0/docs/api/java/util/... http://cs.gmu.edu/cne/modules/ipc/ http://citeseer.ist.psu.edu/cis?q=semaphore http://www.cs.utexas.edu/users/EWD/ewd00xx/EWD74.P... http://www.cs.utexas.edu/users/EWD/transcriptions/... http://lkml.org/lkml/2005/12/19/34 http://www.opengroup.org/onlinepubs/009695399/base...